package com.xxx4biji.optional;

import com.xxx4biji.entity.Employee;
import com.xxx4biji.entity.Godness;
import com.xxx4biji.entity.NewMan;
import org.junit.Test;

import java.util.Optional;

public class TestOptional {
    /**
     * Optional容器类的常用方法:
     * Optional.of(T t):创建一个Optional实例
     * Optional.empty() :创建一个空的Optional实例
     * Optional.ofNullable(T t):若t不为 null,创建Optional 实例,否则创建空实例
     * isPresent() :判断是否包含值
     * orElse(T t) :如果调用对象包含值,返回该值,舌则返回t
     * orElseGet(supplier s) :如果调用对象包含值，返回该值，否则返回 s 获攻的值
     * map(Function f):如果有值对其处理，并返回处理后的Optional，否则返回Optional.empty()
     * flatMap(Function mapper):与map类似，要求返回值必须是Optional
     */

    @Test
    public void test0(){
        //能快速定位空指针位置                 在这里
        Optional<Employee> op = Optional.of(null);
        Employee employee = op.get();
        System.out.println(employee);
    }

    @Test
    public void test1(){
        Optional<Employee> op = Optional.of(new Employee());
        Employee employee = op.get();
        System.out.println(employee);
    }

    @Test
    public void test2(){
        Optional<Employee> op = Optional.empty();
        Employee employee = op.get();
        System.out.println(employee);
    }

    @Test
    public void test3(){
        Employee employee = null;
        Optional<Employee> op = Optional.ofNullable(employee);
        if (op.isPresent()){
            System.out.println(op.get());
        }
    }

    //例题
    @Test
    public void test5(){
        Optional<NewMan> op = Optional.ofNullable(null);
        String name = getGodnessName(op);
        System.out.println(name);
    }

    //需求:获取一个男人♥中的女神名字
    public String getGodnessName(Optional<NewMan> man){
        return man.orElse(new NewMan())
                    .getGodness()
                    .orElse(new Godness("苍老师"))
                    .getName();
    }
}
